﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Unimaq.FacturaDBS_Spring.WinForms_Presentacion
{
    public partial class Principal2 : Form
    {
        private List<Entidades.Version2.Spring.CM_CO_Comprobante_Interfase> listaSpring;

        private List<Entidades.Version2.DBS.DBS_Cabecera> listaCabecera_DBS;
        private List<Entidades.Version2.DBS.DBS_Detalle> listaDetalleDBS;
        private List<Entidades.Version2.DBS.DBS_Detalle> UC_listaDetalle_FACTURA;
        private List<Entidades.Version2.DBS.DBS_Detalle> UC_listaDetalle_NOTACREDITO;
        private List<Entidades.Version2.DBS.DBS_Detalle> UD_listaDetalle_FAMA;
        private List<Entidades.Version2.DBS.DBS_Detalle> UD_listaDetalle_OT;
        private List<Entidades.Version2.DBS.DBS_Detalle> UH_listaDetalle_FAMA;
        private List<Entidades.Version2.DBS.DBS_Detalle> UH_listaDetalle_NOFAMA;

        private List<string> filterQuery;

        public Principal2()
        {
            InitializeComponent();

            listaSpring = new List<Entidades.Version2.Spring.CM_CO_Comprobante_Interfase>();

            listaCabecera_DBS = new List<Entidades.Version2.DBS.DBS_Cabecera>();

            listaDetalleDBS = new List<Entidades.Version2.DBS.DBS_Detalle>();
            UC_listaDetalle_FACTURA = new List<Entidades.Version2.DBS.DBS_Detalle>();
            UC_listaDetalle_NOTACREDITO = new List<Entidades.Version2.DBS.DBS_Detalle>();
            UD_listaDetalle_FAMA = new List<Entidades.Version2.DBS.DBS_Detalle>();
            UD_listaDetalle_OT = new List<Entidades.Version2.DBS.DBS_Detalle>();
            UH_listaDetalle_FAMA = new List<Entidades.Version2.DBS.DBS_Detalle>();
            UH_listaDetalle_NOFAMA = new List<Entidades.Version2.DBS.DBS_Detalle>();

            filterQuery = new List<string>();
        }

        private void chkFechaEmision_CheckedChanged(object sender, EventArgs e)
        {
            if (chkFechaEmision.Checked)
            {
                dtFechaEmisionInicio.Enabled = true;
                dtFechaEmisionFin.Enabled = true;
            }
            else
            {
                dtFechaEmisionInicio.Enabled = false;
                dtFechaEmisionFin.Enabled = false;
            }
        }

        private void btnObtenerDatos_Click(object sender, EventArgs e)
        {
            if (chkFechaEmision.Checked)
            {
                if (dtFechaEmisionFin.Value.Date >= dtFechaEmisionInicio.Value.Date)
                {
                    DialogResult dr;

                    if ((dtFechaEmisionFin.Value - dtFechaEmisionInicio.Value).TotalDays > 31)
                    {
                        dr = MessageBox.Show("Advertencia: El intervalo ingresado hará que el sistema demore más de lo normal. ¿Esta seguro en continuar? ", "DBS2Spring", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);
                    }
                    else
                    {
                        dr = DialogResult.Yes;
                    }

                    if (dr == DialogResult.Yes)
                    {
                        DateTime fechaEmisionInicio = dtFechaEmisionInicio.Value;
                        DateTime fechaEmisionFin = dtFechaEmisionFin.Value;

                        LogicaNegocio.Version2.DBS.DBS_CabeceraBLL dbs_HeaderBLL = new LogicaNegocio.Version2.DBS.DBS_CabeceraBLL();
                        LogicaNegocio.Version2.DBS.DBS_DetalleBLL dbs_DetalleBLL = new LogicaNegocio.Version2.DBS.DBS_DetalleBLL();

                        //leemos la cabecera en el DBS
                        listaCabecera_DBS = dbs_HeaderBLL.Listar_AS400(fechaEmisionInicio, fechaEmisionFin);
                        
                        gridDBS_Cabecera.DataSource = null;
                        gridDBS_Cabecera.DataSource = listaCabecera_DBS;
                        gridDBS_Cabecera.ClearSelection();
                        lbl_DBSCabecera_filas.Text = listaCabecera_DBS.Count.ToString("N");

                        //Leemos el detalle en el DBS
                        listaDetalleDBS = dbs_DetalleBLL.Listar_AS400(fechaEmisionInicio, fechaEmisionFin);        

                        //REPUESTOS
                        UC_listaDetalle_FACTURA = dbs_DetalleBLL.Listar_UC_FACTURA_AS400(listaDetalleDBS);
                        dbs_DetalleBLL.Cargar_DBS_Detalle_LineAD(UC_listaDetalle_FACTURA);
                        UC_listaDetalle_NOTACREDITO = dbs_DetalleBLL.Listar_UC_NOTACREDITO_AS400(listaDetalleDBS);
                        //SERVICIOS
                        UD_listaDetalle_FAMA = dbs_DetalleBLL.Listar_UD_FAMA_AS400(listaDetalleDBS);
                        UD_listaDetalle_OT = dbs_DetalleBLL.Listar_UD_OT_AS400(listaDetalleDBS);
                        //ALQUILERES
                        UH_listaDetalle_FAMA = dbs_DetalleBLL.Listar_UH_FAMA_AS400(listaDetalleDBS);
                        UH_listaDetalle_NOFAMA = dbs_DetalleBLL.Listar_UH_NOFAMA_AS400(listaDetalleDBS);

                        gridDBS_Detalle.DataSource = null;
                        gridDBS_Detalle.DataSource = listaDetalleDBS;
                        gridDBS_Detalle.ClearSelection();
                        lbl_DBSDetalle_filas.Text = listaDetalleDBS.Count.ToString("N");


                        //Convertimos a Spring
                        LogicaNegocio.Version2.Spring.CM_CO_Comprobante_InterfaseBLL comprobanteInterafaseBLL = new LogicaNegocio.Version2.Spring.CM_CO_Comprobante_InterfaseBLL();
                        LogicaNegocio.Version2.Spring.CM_CO_ComprobanteDetalle_InterfaseBLL comprobanteDetalleInterafaseBLL = new LogicaNegocio.Version2.Spring.CM_CO_ComprobanteDetalle_InterfaseBLL();

                        listaSpring = dbs_HeaderBLL.ConverTo_Spring(listaCabecera_DBS);
                        List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> lista1 = dbs_DetalleBLL.UC_FACTURA_ConverTo_Spring(UC_listaDetalle_FACTURA);
                        List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> lista2 = dbs_DetalleBLL.UC_NOTACREDITO_ConverTo_Spring(UC_listaDetalle_NOTACREDITO);
                        List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> lista3 = dbs_DetalleBLL.UD_ConvertTo_Spring(UD_listaDetalle_FAMA);
                        List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> lista4 = dbs_DetalleBLL.UD_ConvertTo_Spring(UD_listaDetalle_OT);
                        List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> lista5 = dbs_DetalleBLL.UH_ConvertTo_Spring(UH_listaDetalle_FAMA);
                        List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> lista6 = dbs_DetalleBLL.UH_ConvertTo_Spring(UH_listaDetalle_NOFAMA);

                        List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> listaSpringDetalle = lista1.Union(lista2).Union(lista3).Union(lista4).Union(lista5).Union(lista6).ToList();

                        comprobanteInterafaseBLL.Cabecera_Detalle_Relacion(listaSpring, listaSpringDetalle);

                        List<Entidades.Version2.Spring.CM_CO_Comprobante_Interfase> listaSpring_Correcta = listaSpring.Where(x => x.ErrorSistema != "E").ToList();
                        List<Entidades.Version2.Spring.CM_CO_Comprobante_Interfase> listaSpring_Incorrecta = listaSpring.Where(x => x.ErrorSistema == "E").ToList();
                        comprobanteInterafaseBLL.Cabecera_Detalle_AjustarMontos(listaSpring_Correcta);

                        //grid Spring
                        gridSpring_Cabecera.DataSource = null;
                        gridSpring_Cabecera.DataSource = listaSpring_Correcta;
                        gridSpring_Cabecera.ClearSelection();
                        lblSpring_Detalle_filas.Text = listaSpring_Correcta.Count.ToString("N");

                        gridSpring_Detalle.DataSource = null;

                        //detalle de errores
                        gridSpring_Error.DataSource = null;
                        gridSpring_Error.DataSource = listaSpring_Incorrecta;
                        gridSpring_Error.ClearSelection();

                        //grid temporal
                        dataGridView1.DataSource = null;
                        dataGridView1.DataSource = listaDetalleDBS;
                        dataGridView1.ClearSelection();


                        dataGridView2.DataSource = null;
                        dataGridView2.DataSource = listaSpringDetalle;
                        dataGridView2.ClearSelection();
                    }
                }
                else
                {
                    MessageBox.Show("La fecha final no puede ser menor a la fecha de inicio", "DBS2Spring", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("Indique el intervalo de fechas que va a realizar la consulta.\nEjemplo: 01/01/2014 - 10/01/2014", "DBS2Spring", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void btn_Cab_AnularSeleccion_Click(object sender, EventArgs e)
        {
            gridDBS_Detalle.ClearSelection();
        }

        private void chk_Cab_TipoComprobante_CheckedChanged(object sender, EventArgs e)
        {
            if (chk_Cab_TipoComprobante.Checked)
            {
                cmb_Cab_TipoComprobante.DataSource = listaSpring.Select(x => x.TipoComprobante).Distinct().ToList();
                cmb_Cab_TipoComprobante.Enabled = true;
            }
            else
            {
                cmb_Cab_TipoComprobante.ResetText();
                cmb_Cab_TipoComprobante.Enabled = false;
            }
        }

        private void chk_Cab_SerieComprobante_CheckedChanged(object sender, EventArgs e)
        {
            if (chk_Cab_SerieComprobante.Checked)
            {
                cmb_Cab_SerieComprobante.DataSource = listaSpring.Select(x => x.SerieComprobante).Distinct().ToList();
                cmb_Cab_SerieComprobante.Enabled = true;
            }
            else
            {
                cmb_Cab_SerieComprobante.ResetText();
                cmb_Cab_SerieComprobante.Enabled = false;
            }
        }

        private void chk_Cab_CCosto_CheckedChanged(object sender, EventArgs e)
        {
            if (chk_Cab_CCosto.Checked)
            {
                cmb_Cab_CCosto.DataSource = listaSpring.Select(x => x.CentroCosto).Distinct().ToList();
                cmb_Cab_CCosto.Enabled = true;
            }
            else
            {
                cmb_Cab_CCosto.ResetText();
                cmb_Cab_CCosto.Enabled = false;
            }
        }

        private void chk_Filtrar_CheckedChanged(object sender, EventArgs e)
        {
            if (chk_Filtrar.Checked)
            {
                //(gridCabecera.DataSource as DataTable).DefaultView.RowFilter = 
            }
            else
            {
                chk_Cab_TipoComprobante.Checked = false;
                chk_Cab_SerieComprobante.Checked = false;
                chk_Cab_NumeroComprobante.Checked = false;
                chk_Cab_CCosto.Checked = false;

                //carga nuevamente la lista al grid
            }
        }

        private void cmb_Cab_TipoComprobante_SelectionChangeCommitted(object sender, EventArgs e)
        {
            //filterQuery.Add(string.Format()
        }

        private void gridSpring_Cabecera_SelectionChanged(object sender, EventArgs e)
        {
            if (gridSpring_Cabecera.Rows.Count > 0)
            {
                if (gridSpring_Cabecera.SelectedRows.Count > 0)
                {
                    Entidades.Version2.Spring.CM_CO_Comprobante_Interfase selectedRow = gridSpring_Cabecera.SelectedRows[0].DataBoundItem as Entidades.Version2.Spring.CM_CO_Comprobante_Interfase;

                    if (selectedRow != null)
                    {
                        gridSpring_Detalle.DataSource = null;
                        gridSpring_Detalle.DataSource = selectedRow.ListaDetalle;
                        gridSpring_Detalle.ClearSelection();
                    }
                }
            }
        }

        private void btn_Cab_TransfSpring_Click(object sender, EventArgs e)
        {
            if (gridSpring_Cabecera.Rows.Count > 0)
            {
                List<Entidades.Version2.Spring.CM_CO_Comprobante_Interfase> lista = gridSpring_Cabecera.DataSource as List<Entidades.Version2.Spring.CM_CO_Comprobante_Interfase>;

                if (lista != null)
                {
                    DialogResult dr = MessageBox.Show("¿Esta seguro en transferir los registros al sistema spring?", "DBS2Spring", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                    if (dr == DialogResult.Yes)
                    {
                        LogicaNegocio.Version2.Spring.CM_CO_Comprobante_InterfaseBLL CM_CO_ComprobanteInterfaseBLL = new LogicaNegocio.Version2.Spring.CM_CO_Comprobante_InterfaseBLL();
                        List<int> resultado = CM_CO_ComprobanteInterfaseBLL.Registrar(lista);

                        if (resultado.Count == 3)
                        {
                            if (resultado[0] > 0)
                            {
                                MessageBox.Show(string.Format("Registros de cabecera: {0}\nRegistros de Detalle: {1}\nPROCESO DE CARGA: {2}\nEl proceso ha terminado satisfactoriamente.", resultado[0].ToString(), resultado[1].ToString(), resultado[2].ToString()), "DBS - Spring", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("El usuario ha cancelado la operación", "DBS2Spring", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    }
                }
            }
            else
            {
                MessageBox.Show("La lista se encuentra vacía", "DBS2Spring", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
            }
        }

        private void chk_Filtrar_CheckedChanged_1(object sender, EventArgs e)
        {

        }
    }
}
